<!--
  ~ Copyright 2020 lcnap
  ~
  ~ Licensed under the Apache License, Version 2.0 (the "License");
  ~ you may not use this file except in compliance with the License.
  ~ You may obtain a copy of the License at
  ~
  ~     http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing, software
  ~ distributed under the License is distributed on an "AS IS" BASIS,
  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License.
  -->

<!doctype html>
<html>
<head>
    <meta charset='UTF-8'>
    <meta name='viewport' content='width=device-width initial-scale=1'>
    <title>simple-rpc 简述</title>
    <style type='text/css'>html {overflow-x: initial !important;}:root { --node-fill: #ECECFF; --node-border: #CCCCFF; --cluster-fill: #ffffde; --cluster-border: #aaaa33; --note-fill: #fff5ad; --note-border: #aaaa33; --mermaid-color: var(--text-color); }
.label { font-family: var(--mermaid-font-family); color: rgb(51, 51, 51); }
.label text { fill: rgb(51, 51, 51); }
.node rect, .node circle, .node ellipse, .node polygon { fill: var(--node-fill); stroke: rgb(147, 112, 219); stroke-width: 1px; }
.node .label { text-align: center; }
.node.clickable { cursor: pointer; }
.arrowheadPath { fill: var(--text-color); }
.edgePath .path { stroke: var(--text-color); stroke-width: 1.5px; }
.edgeLabel { background-color: rgb(232, 232, 232); text-align: center; }
.cluster rect { fill: var(--cluster-fill); stroke: var(--cluster-border); stroke-width: 1px; }
.cluster text { fill: var(--text-color); }
div.mermaidTooltip { position: absolute; text-align: center; max-width: 200px; padding: 2px; font-family: var(--mermaid-font-family); font-size: 12px; background: var(--cluster-fill); border: 1px solid var(--cluster-border); border-radius: 2px; pointer-events: none; z-index: 100; }
.actor { stroke: var(--node-border); fill: var(--node-fill); }
text.actor { fill: black; stroke: none; }
.actor-line { stroke: grey; }
.messageLine0 { stroke-width: 1.5; stroke: var(--text-color); }
.messageLine1 { stroke-width: 1.5; stroke: var(--text-color); }
#arrowhead { fill: var(--text-color); }
.sequenceNumber { fill: white; }
#sequencenumber { fill: var(--text-color); }
#crosshead path { fill: var(--text-color)  !important; stroke: var(--text-color)  !important; }
.messageText { fill: var(--text-color); stroke: none; }
.labelBox { stroke: var(--node-border); fill: var(--node-fill); }
.labelText { fill: black; stroke: none; }
.loopText { fill: black; stroke: none; }
.loopLine { stroke-width: 2; stroke: var(--node-border); }
.note { stroke: var(--cluster-border); fill: rgb(255, 245, 173); }
.noteText { fill: black; stroke: none; font-family: var(--mermaid-font-family); font-size: 14px; }
.activation0 { fill: rgb(244, 244, 244); stroke: rgb(102, 102, 102); }
.activation1 { fill: rgb(244, 244, 244); stroke: rgb(102, 102, 102); }
.activation2 { fill: rgb(244, 244, 244); stroke: rgb(102, 102, 102); }
.mermaid-main-font { font-family: var(--mermaid-font-family); }
.section { stroke: none; opacity: 0.2; }
.section0 { fill: rgba(102, 102, 255, 0.49); }
.section2 { fill: rgb(255, 244, 0); }
.section1, .section3 { fill: white; opacity: 0.2; }
.sectionTitle0 { fill: var(--text-color); }
.sectionTitle1 { fill: var(--text-color); }
.sectionTitle2 { fill: var(--text-color); }
.sectionTitle3 { fill: var(--text-color); }
.sectionTitle { text-anchor: start; font-size: 11px; font-family: var(--mermaid-font-family); }
.grid .tick { stroke: lightgrey; opacity: 0.3; shape-rendering: crispedges; }
.grid .tick text { font-family: var(--mermaid-font-family); }
.grid path { stroke-width: 0; }
.today { fill: none; stroke: red; stroke-width: 2px; }
.task { stroke-width: 2; }
.taskText { text-anchor: middle; font-family: var(--mermaid-font-family); }
.taskText:not([font-size]) { font-size: 11px; }
.taskTextOutsideRight { fill: black; text-anchor: start; font-size: 11px; font-family: var(--mermaid-font-family); }
.taskTextOutsideLeft { fill: black; text-anchor: end; font-size: 11px; }
.task.clickable { cursor: pointer; }
.taskText.clickable { cursor: pointer; font-weight: bold; fill: rgb(0, 49, 99) !important; }
.taskTextOutsideLeft.clickable { cursor: pointer; font-weight: bold; fill: rgb(0, 49, 99) !important; }
.taskTextOutsideRight.clickable { cursor: pointer; font-weight: bold; fill: rgb(0, 49, 99) !important; }
.taskText0, .taskText1, .taskText2, .taskText3 { fill: white; }
.task0, .task1, .task2, .task3 { fill: rgb(138, 144, 221); stroke: rgb(83, 79, 188); }
.taskTextOutside0, .taskTextOutside2 { fill: black; }
.taskTextOutside1, .taskTextOutside3 { fill: black; }
.active0, .active1, .active2, .active3 { fill: rgb(191, 199, 255); stroke: rgb(83, 79, 188); }
.activeText0, .activeText1, .activeText2, .activeText3 { fill: black !important; }
.done0, .done1, .done2, .done3 { stroke: grey; fill: lightgrey; stroke-width: 2; }
.doneText0, .doneText1, .doneText2, .doneText3 { fill: black !important; }
.crit0, .crit1, .crit2, .crit3 { stroke: rgb(255, 136, 136); fill: red; stroke-width: 2; }
.activeCrit0, .activeCrit1, .activeCrit2, .activeCrit3 { stroke: rgb(255, 136, 136); fill: rgb(191, 199, 255); stroke-width: 2; }
.doneCrit0, .doneCrit1, .doneCrit2, .doneCrit3 { stroke: rgb(255, 136, 136); fill: lightgrey; stroke-width: 2; cursor: pointer; shape-rendering: crispedges; }
.milestone { transform: rotate(45deg) scale(0.8, 0.8); }
.milestoneText { font-style: italic; }
.doneCritText0, .doneCritText1, .doneCritText2, .doneCritText3 { fill: black !important; }
.activeCritText0, .activeCritText1, .activeCritText2, .activeCritText3 { fill: black !important; }
.titleText { text-anchor: middle; font-size: 18px; fill: black; font-family: var(--mermaid-font-family); }
g.classGroup text { fill: rgb(147, 112, 219); stroke: none; font-family: var(--mermaid-font-family); font-size: 10px; }
g.classGroup text .title { font-weight: bolder; }
g.classGroup rect { fill: var(--node-fill); stroke: rgb(147, 112, 219); }
g.classGroup line { stroke: rgb(147, 112, 219); stroke-width: 1; }
.classLabel .box { stroke: none; stroke-width: 0; fill: var(--node-fill); opacity: 0.5; }
.classLabel .label { fill: rgb(147, 112, 219); font-size: 10px; }
.relation { stroke: rgb(147, 112, 219); stroke-width: 1; fill: none; }
#compositionStart { fill: rgb(147, 112, 219); stroke: rgb(147, 112, 219); stroke-width: 1; }
#compositionEnd { fill: rgb(147, 112, 219); stroke: rgb(147, 112, 219); stroke-width: 1; }
#aggregationStart { fill: var(--node-fill); stroke: rgb(147, 112, 219); stroke-width: 1; }
#aggregationEnd { fill: var(--node-fill); stroke: rgb(147, 112, 219); stroke-width: 1; }
#dependencyStart { fill: rgb(147, 112, 219); stroke: rgb(147, 112, 219); stroke-width: 1; }
#dependencyEnd { fill: rgb(147, 112, 219); stroke: rgb(147, 112, 219); stroke-width: 1; }
#extensionStart { fill: rgb(147, 112, 219); stroke: rgb(147, 112, 219); stroke-width: 1; }
#extensionEnd { fill: rgb(147, 112, 219); stroke: rgb(147, 112, 219); stroke-width: 1; }
.commit-id, .commit-msg, .branch-label { fill: lightgrey; color: lightgrey; font-family: var(--mermaid-font-family); }
.pieTitleText { text-anchor: middle; font-size: 25px; fill: var(--text-color); font-family: var(--mermaid-font-family); }
.slice { font-family: var(--mermaid-font-family); }
g.stateGroup text { fill: rgb(147, 112, 219); stroke: none; font-size: 10px; font-family: var(--mermaid-font-family); }
g.stateGroup text { fill: rgb(147, 112, 219); stroke: none; font-size: 10px; }
g.stateGroup .state-title { font-weight: bolder; fill: black; }
g.stateGroup rect { fill: var(--node-fill); stroke: rgb(147, 112, 219); }
g.stateGroup line { stroke: rgb(147, 112, 219); stroke-width: 1; }
.transition { stroke: rgb(147, 112, 219); stroke-width: 1; fill: none; }
.stateGroup .composit { fill: white; border-bottom: 1px; }
.state-note { stroke: var(--cluster-border); fill: rgb(255, 245, 173); }
.state-note text { fill: black; stroke: none; font-size: 10px; }
.stateLabel .box { stroke: none; stroke-width: 0; fill: var(--node-fill); opacity: 0.5; }
.stateLabel text { fill: black; font-size: 10px; font-weight: bold; font-family: var(--mermaid-font-family); }
.node text { font-size: 14px; }
div.mermaidTooltip { position: absolute; text-align: center; max-width: 200px; padding: 2px; font-family: var(--mermaid-font-family); font-size: 12px; background: var(--cluster-fill); border: 1px solid var(--cluster-border); border-radius: 2px; pointer-events: none; z-index: 100; }
#write .md-diagram-panel .md-diagram-panel-preview div { width: initial; }


:root { --bg-color:#ffffff; --text-color:#333333; --select-text-bg-color:#B5D6FC; --select-text-font-color:auto; --monospace:"Lucida Console",Consolas,"Courier",monospace; }
html { font-size: 14px; background-color: var(--bg-color); color: var(--text-color); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; }
body { margin: 0px; padding: 0px; height: auto; bottom: 0px; top: 0px; left: 0px; right: 0px; font-size: 1rem; line-height: 1.42857; overflow-x: hidden; background: inherit; tab-size: 4; }
iframe { margin: auto; }
a.url { word-break: break-all; }
a:active, a:hover { outline: 0px; }
.in-text-selection, ::selection { text-shadow: none; background: var(--select-text-bg-color); color: var(--select-text-font-color); }
#write { margin: 0px auto; height: auto; width: inherit; word-break: normal; overflow-wrap: break-word; position: relative; white-space: normal; overflow-x: visible; padding-top: 40px; }
#write.first-line-indent p { text-indent: 2em; }
#write.first-line-indent li p, #write.first-line-indent p * { text-indent: 0px; }
#write.first-line-indent li { margin-left: 2em; }
.for-image #write { padding-left: 8px; padding-right: 8px; }
body.typora-export { padding-left: 30px; padding-right: 30px; }
.typora-export .footnote-line, .typora-export li, .typora-export p { white-space: pre-wrap; }
@media screen and (max-width: 500px) {
  body.typora-export { padding-left: 0px; padding-right: 0px; }
  #write { padding-left: 20px; padding-right: 20px; }
  .CodeMirror-sizer { margin-left: 0px !important; }
  .CodeMirror-gutters { display: none !important; }
}
#write li > figure:last-child { margin-bottom: 0.5rem; }
#write ol, #write ul { position: relative; }
img { max-width: 100%; vertical-align: middle; }
button, input, select, textarea { color: inherit; font: inherit; }
input[type="checkbox"], input[type="radio"] { line-height: normal; padding: 0px; }
*, ::after, ::before { box-sizing: border-box; }
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p, #write pre { width: inherit; }
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p { position: relative; }
p { line-height: inherit; }
h1, h2, h3, h4, h5, h6 { break-after: avoid-page; break-inside: avoid; orphans: 2; }
p { orphans: 4; }
h1 { font-size: 2rem; }
h2 { font-size: 1.8rem; }
h3 { font-size: 1.6rem; }
h4 { font-size: 1.4rem; }
h5 { font-size: 1.2rem; }
h6 { font-size: 1rem; }
.md-math-block, .md-rawblock, h1, h2, h3, h4, h5, h6, p { margin-top: 1rem; margin-bottom: 1rem; }
.hidden { display: none; }
.md-blockmeta { color: rgb(204, 204, 204); font-weight: 700; font-style: italic; }
a { cursor: pointer; }
sup.md-footnote { padding: 2px 4px; background-color: rgba(238, 238, 238, 0.7); color: rgb(85, 85, 85); border-radius: 4px; cursor: pointer; }
sup.md-footnote a, sup.md-footnote a:hover { color: inherit; text-transform: inherit; text-decoration: inherit; }
#write input[type="checkbox"] { cursor: pointer; width: inherit; height: inherit; }
figure { overflow-x: auto; margin: 1.2em 0px; max-width: calc(100% + 16px); padding: 0px; }
figure > table { margin: 0px !important; }
tr { break-inside: avoid; break-after: auto; }
thead { display: table-header-group; }
table { border-collapse: collapse; border-spacing: 0px; width: 100%; overflow: auto; break-inside: auto; text-align: left; }
table.md-table td { min-width: 32px; }
.CodeMirror-gutters { border-right: 0px; background-color: inherit; }
.CodeMirror-linenumber { user-select: none; }
.CodeMirror { text-align: left; }
.CodeMirror-placeholder { opacity: 0.3; }
.CodeMirror pre { padding: 0px 4px; }
.CodeMirror-lines { padding: 0px; }
div.hr:focus { cursor: none; }
#write pre { white-space: pre-wrap; }
#write.fences-no-line-wrapping pre { white-space: pre; }
#write pre.ty-contain-cm { white-space: normal; }
.CodeMirror-gutters { margin-right: 4px; }
.md-fences { font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; overflow: visible; white-space: pre; background: inherit; position: relative !important; }
.md-diagram-panel { width: 100%; margin-top: 10px; text-align: center; padding-top: 0px; padding-bottom: 8px; overflow-x: auto; }
#write .md-fences.mock-cm { white-space: pre-wrap; }
.md-fences.md-fences-with-lineno { padding-left: 0px; }
#write.fences-no-line-wrapping .md-fences.mock-cm { white-space: pre; overflow-x: auto; }
.md-fences.mock-cm.md-fences-with-lineno { padding-left: 8px; }
.CodeMirror-line, twitterwidget { break-inside: avoid; }
.footnotes { opacity: 0.8; font-size: 0.9rem; margin-top: 1em; margin-bottom: 1em; }
.footnotes + .footnotes { margin-top: 0px; }
.md-reset { margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: top; background: 0px 0px; text-decoration: none; text-shadow: none; float: none; position: static; width: auto; height: auto; white-space: nowrap; cursor: inherit; -webkit-tap-highlight-color: transparent; line-height: normal; font-weight: 400; text-align: left; box-sizing: content-box; direction: ltr; }
li div { padding-top: 0px; }
blockquote { margin: 1rem 0px; }
li .mathjax-block, li p { margin: 0.5rem 0px; }
li { margin: 0px; position: relative; }
blockquote > :last-child { margin-bottom: 0px; }
blockquote > :first-child, li > :first-child { margin-top: 0px; }
.footnotes-area { color: rgb(136, 136, 136); margin-top: 0.714rem; padding-bottom: 0.143rem; white-space: normal; }
#write .footnote-line { white-space: pre-wrap; }
@media print {
  body, html { border: 1px solid transparent; height: 99%; break-after: avoid; break-before: avoid; }
  #write { margin-top: 0px; padding-top: 0px; border-color: transparent !important; }
  .typora-export * { -webkit-print-color-adjust: exact; }
  html.blink-to-pdf { font-size: 13px; }
  .typora-export #write { padding-left: 32px; padding-right: 32px; padding-bottom: 0px; break-after: avoid; }
  .typora-export #write::after { height: 0px; }
}
.footnote-line { margin-top: 0.714em; font-size: 0.7em; }
a img, img a { cursor: pointer; }
pre.md-meta-block { font-size: 0.8rem; min-height: 0.8rem; white-space: pre-wrap; background: rgb(204, 204, 204); display: block; overflow-x: hidden; }
p > .md-image:only-child:not(.md-img-error) img, p > img:only-child { display: block; margin: auto; }
p > .md-image:only-child { display: inline-block; width: 100%; }
#write .MathJax_Display { margin: 0.8em 0px 0px; }
.md-math-block { width: 100%; }
.md-math-block:not(:empty)::after { display: none; }
[contenteditable="true"]:active, [contenteditable="true"]:focus, [contenteditable="false"]:active, [contenteditable="false"]:focus { outline: 0px; box-shadow: none; }
.md-task-list-item { position: relative; list-style-type: none; }
.task-list-item.md-task-list-item { padding-left: 0px; }
.md-task-list-item > input { position: absolute; top: 0px; left: 0px; margin-left: -1.2em; margin-top: calc(1em - 10px); border: none; }
.math { font-size: 1rem; }
.md-toc { min-height: 3.58rem; position: relative; font-size: 0.9rem; border-radius: 10px; }
.md-toc-content { position: relative; margin-left: 0px; }
.md-toc-content::after, .md-toc::after { display: none; }
.md-toc-item { display: block; color: rgb(65, 131, 196); }
.md-toc-item a { text-decoration: none; }
.md-toc-inner:hover { text-decoration: underline; }
.md-toc-inner { display: inline-block; cursor: pointer; }
.md-toc-h1 .md-toc-inner { margin-left: 0px; font-weight: 700; }
.md-toc-h2 .md-toc-inner { margin-left: 2em; }
.md-toc-h3 .md-toc-inner { margin-left: 4em; }
.md-toc-h4 .md-toc-inner { margin-left: 6em; }
.md-toc-h5 .md-toc-inner { margin-left: 8em; }
.md-toc-h6 .md-toc-inner { margin-left: 10em; }
@media screen and (max-width: 48em) {
  .md-toc-h3 .md-toc-inner { margin-left: 3.5em; }
  .md-toc-h4 .md-toc-inner { margin-left: 5em; }
  .md-toc-h5 .md-toc-inner { margin-left: 6.5em; }
  .md-toc-h6 .md-toc-inner { margin-left: 8em; }
}
a.md-toc-inner { font-size: inherit; font-style: inherit; font-weight: inherit; line-height: inherit; }
.footnote-line a:not(.reversefootnote) { color: inherit; }
.md-attr { display: none; }
.md-fn-count::after { content: "."; }
code, pre, samp, tt { font-family: var(--monospace); }
kbd { margin: 0px 0.1em; padding: 0.1em 0.6em; font-size: 0.8em; color: rgb(36, 39, 41); background: rgb(255, 255, 255); border: 1px solid rgb(173, 179, 185); border-radius: 3px; box-shadow: rgba(12, 13, 14, 0.2) 0px 1px 0px, rgb(255, 255, 255) 0px 0px 0px 2px inset; white-space: nowrap; vertical-align: middle; }
.md-comment { color: rgb(162, 127, 3); opacity: 0.8; font-family: var(--monospace); }
code { text-align: left; vertical-align: initial; }
a.md-print-anchor { white-space: pre !important; border-width: initial !important; border-style: none !important; border-color: initial !important; display: inline-block !important; position: absolute !important; width: 1px !important; right: 0px !important; outline: 0px !important; background: 0px 0px !important; text-decoration: initial !important; text-shadow: initial !important; }
.md-inline-math .MathJax_SVG .noError { display: none !important; }
.html-for-mac .inline-math-svg .MathJax_SVG { vertical-align: 0.2px; }
.md-math-block .MathJax_SVG_Display { text-align: center; margin: 0px; position: relative; text-indent: 0px; max-width: none; max-height: none; min-height: 0px; min-width: 100%; width: auto; overflow-y: hidden; display: block !important; }
.MathJax_SVG_Display, .md-inline-math .MathJax_SVG_Display { width: auto; margin: inherit; display: inline-block !important; }
.MathJax_SVG .MJX-monospace { font-family: var(--monospace); }
.MathJax_SVG .MJX-sans-serif { font-family: sans-serif; }
.MathJax_SVG { display: inline; font-style: normal; font-weight: 400; line-height: normal; zoom: 90%; text-indent: 0px; text-align: left; text-transform: none; letter-spacing: normal; word-spacing: normal; overflow-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; }
.MathJax_SVG * { transition: none 0s ease 0s; }
.MathJax_SVG_Display svg { vertical-align: middle !important; margin-bottom: 0px !important; margin-top: 0px !important; }
.os-windows.monocolor-emoji .md-emoji { font-family: "Segoe UI Symbol", sans-serif; }
.md-diagram-panel > svg { max-width: 100%; }
[lang="flow"] svg, [lang="mermaid"] svg { max-width: 100%; height: auto; }
[lang="mermaid"] .node text { font-size: 1rem; }
table tr th { border-bottom: 0px; }
video { max-width: 100%; display: block; margin: 0px auto; }
iframe { max-width: 100%; width: 100%; border: none; }
.highlight td, .highlight tr { border: 0px; }
svg[id^="mermaidChart"] { line-height: 1em; }
mark { background: rgb(255, 255, 0); color: rgb(0, 0, 0); }
.md-html-inline .md-plain, .md-html-inline strong, mark .md-inline-math, mark strong { color: inherit; }
mark .md-meta { color: rgb(0, 0, 0); opacity: 0.3 !important; }


.CodeMirror { height: auto; }
.CodeMirror.cm-s-inner { background: inherit; }
.CodeMirror-scroll { overflow: auto hidden; z-index: 3; }
.CodeMirror-gutter-filler, .CodeMirror-scrollbar-filler { background-color: rgb(255, 255, 255); }
.CodeMirror-gutters { border-right: 1px solid rgb(221, 221, 221); background: inherit; white-space: nowrap; }
.CodeMirror-linenumber { padding: 0px 3px 0px 5px; text-align: right; color: rgb(153, 153, 153); }
.cm-s-inner .cm-keyword { color: rgb(119, 0, 136); }
.cm-s-inner .cm-atom, .cm-s-inner.cm-atom { color: rgb(34, 17, 153); }
.cm-s-inner .cm-number { color: rgb(17, 102, 68); }
.cm-s-inner .cm-def { color: rgb(0, 0, 255); }
.cm-s-inner .cm-variable { color: rgb(0, 0, 0); }
.cm-s-inner .cm-variable-2 { color: rgb(0, 85, 170); }
.cm-s-inner .cm-variable-3 { color: rgb(0, 136, 85); }
.cm-s-inner .cm-string { color: rgb(170, 17, 17); }
.cm-s-inner .cm-property { color: rgb(0, 0, 0); }
.cm-s-inner .cm-operator { color: rgb(152, 26, 26); }
.cm-s-inner .cm-comment, .cm-s-inner.cm-comment { color: rgb(170, 85, 0); }
.cm-s-inner .cm-string-2 { color: rgb(255, 85, 0); }
.cm-s-inner .cm-meta { color: rgb(85, 85, 85); }
.cm-s-inner .cm-qualifier { color: rgb(85, 85, 85); }
.cm-s-inner .cm-builtin { color: rgb(51, 0, 170); }
.cm-s-inner .cm-bracket { color: rgb(153, 153, 119); }
.cm-s-inner .cm-tag { color: rgb(17, 119, 0); }
.cm-s-inner .cm-attribute { color: rgb(0, 0, 204); }
.cm-s-inner .cm-header, .cm-s-inner.cm-header { color: rgb(0, 0, 255); }
.cm-s-inner .cm-quote, .cm-s-inner.cm-quote { color: rgb(0, 153, 0); }
.cm-s-inner .cm-hr, .cm-s-inner.cm-hr { color: rgb(153, 153, 153); }
.cm-s-inner .cm-link, .cm-s-inner.cm-link { color: rgb(0, 0, 204); }
.cm-negative { color: rgb(221, 68, 68); }
.cm-positive { color: rgb(34, 153, 34); }
.cm-header, .cm-strong { font-weight: 700; }
.cm-del { text-decoration: line-through; }
.cm-em { font-style: italic; }
.cm-link { text-decoration: underline; }
.cm-error { color: red; }
.cm-invalidchar { color: red; }
.cm-constant { color: rgb(38, 139, 210); }
.cm-defined { color: rgb(181, 137, 0); }
div.CodeMirror span.CodeMirror-matchingbracket { color: rgb(0, 255, 0); }
div.CodeMirror span.CodeMirror-nonmatchingbracket { color: rgb(255, 34, 34); }
.cm-s-inner .CodeMirror-activeline-background { background: inherit; }
.CodeMirror { position: relative; overflow: hidden; }
.CodeMirror-scroll { height: 100%; outline: 0px; position: relative; box-sizing: content-box; background: inherit; }
.CodeMirror-sizer { position: relative; }
.CodeMirror-gutter-filler, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-vscrollbar { position: absolute; z-index: 6; display: none; }
.CodeMirror-vscrollbar { right: 0px; top: 0px; overflow: hidden; }
.CodeMirror-hscrollbar { bottom: 0px; left: 0px; overflow: hidden; }
.CodeMirror-scrollbar-filler { right: 0px; bottom: 0px; }
.CodeMirror-gutter-filler { left: 0px; bottom: 0px; }
.CodeMirror-gutters { position: absolute; left: 0px; top: 0px; padding-bottom: 30px; z-index: 3; }
.CodeMirror-gutter { white-space: normal; height: 100%; box-sizing: content-box; padding-bottom: 30px; margin-bottom: -32px; display: inline-block; }
.CodeMirror-gutter-wrapper { position: absolute; z-index: 4; background: 0px 0px !important; border: none !important; }
.CodeMirror-gutter-background { position: absolute; top: 0px; bottom: 0px; z-index: 4; }
.CodeMirror-gutter-elt { position: absolute; cursor: default; z-index: 4; }
.CodeMirror-lines { cursor: text; }
.CodeMirror pre { border-radius: 0px; border-width: 0px; background: 0px 0px; font-family: inherit; font-size: inherit; margin: 0px; white-space: pre; overflow-wrap: normal; color: inherit; z-index: 2; position: relative; overflow: visible; }
.CodeMirror-wrap pre { overflow-wrap: break-word; white-space: pre-wrap; word-break: normal; }
.CodeMirror-code pre { border-right: 30px solid transparent; width: fit-content; }
.CodeMirror-wrap .CodeMirror-code pre { border-right: none; width: auto; }
.CodeMirror-linebackground { position: absolute; left: 0px; right: 0px; top: 0px; bottom: 0px; z-index: 0; }
.CodeMirror-linewidget { position: relative; z-index: 2; overflow: auto; }
.CodeMirror-wrap .CodeMirror-scroll { overflow-x: hidden; }
.CodeMirror-measure { position: absolute; width: 100%; height: 0px; overflow: hidden; visibility: hidden; }
.CodeMirror-measure pre { position: static; }
.CodeMirror div.CodeMirror-cursor { position: absolute; visibility: hidden; border-right: none; width: 0px; }
.CodeMirror div.CodeMirror-cursor { visibility: hidden; }
.CodeMirror-focused div.CodeMirror-cursor { visibility: inherit; }
.cm-searching { background: rgba(255, 255, 0, 0.4); }
@media print {
  .CodeMirror div.CodeMirror-cursor { visibility: hidden; }
}


:root {
    --side-bar-bg-color: #fff;
    --control-text-color: #777;
}

/* cyrillic-ext */
/* cyrillic */
/* greek-ext */
/* greek */
/* vietnamese */
/* latin-ext */
/* latin */
/* cyrillic-ext */
/* cyrillic */
/* greek-ext */
/* greek */
/* vietnamese */
/* latin-ext */
/* latin */
/* cyrillic-ext */
/* cyrillic */
/* greek-ext */
/* greek */
/* vietnamese */
/* latin-ext */
/* latin */
/* cyrillic-ext */
/* cyrillic */
/* greek-ext */
/* greek */
/* vietnamese */
/* latin-ext */
/* latin */
html {
    font-size: 14px;
}

body {
    font-family: Source Sans Pro, Helvetica Neue, Arial, sans-serif !important;
    color: #34495e;
    -webkit-font-smoothing: antialiased;
    line-height: 1.6rem;
    letter-spacing: 0;
    margin: 0;
    overflow-x: hidden;
}

#write {
    max-width: 860px;
    margin: 0 auto;
    padding: 20px 30px 100px;
}

#write p {
    line-height: 1.6rem;
    word-spacing: .05rem;
}

#write ol li {
    text-indent: 0.5rem;
}

#write > ul:first-child,
#write > ol:first-child {
    margin-top: 30px;
}

body > *:first-child {
    margin-top: 0 !important;
}

body > *:last-child {
    margin-bottom: 0 !important;
}

a {
    color: #42b983;
    font-weight: 600;
    padding: 0 2px;
    text-decoration: none;
}

h1,
h2,
h3,
h4,
h5,
h6 {
    position: relative;
    margin-top: 1rem;
    margin-bottom: 1rem;
    font-weight: bold;
    line-height: 1.4;
    cursor: text;
}

h1:hover a.anchor,
h2:hover a.anchor,
h3:hover a.anchor,
h4:hover a.anchor,
h5:hover a.anchor,
h6:hover a.anchor {
    text-decoration: none;
}

h1 tt,
h1 code {
    font-size: inherit !important;
}

h2 tt,
h2 code {
    font-size: inherit !important;
}

h3 tt,
h3 code {
    font-size: inherit !important;
}

h4 tt,
h4 code {
    font-size: inherit !important;
}

h5 tt,
h5 code {
    font-size: inherit !important;
}

h6 tt,
h6 code {
    font-size: inherit !important;
}

h2 a,
h3 a {
    color: #34495e;
}

h1 {
    padding-bottom: .4rem;
    font-size: 2.2rem;
    line-height: 1.3;
}

h2 {
    font-size: 1.75rem;
    line-height: 1.225;
    margin: 35px 0 15px;
    padding-bottom: 0.5em;
    border-bottom: 1px solid #ddd;
}

h3 {
    font-size: 1.4rem;
    line-height: 1.43;
    margin: 20px 0 7px;
}

h4 {
    font-size: 1.2rem;
}

h5 {
    font-size: 1rem;
}

h6 {
    font-size: 1rem;
    color: #777;
}

p,
blockquote,
ul,
ol,
dl,
table {
    margin: 0.8em 0;
}

li > ol,
li > ul {
    margin: 0 0;
}

hr {
    height: 2px;
    padding: 0;
    margin: 16px 0;
    background-color: #e7e7e7;
    border: 0 none;
    overflow: hidden;
    box-sizing: content-box;
}

body > h2:first-child {
    margin-top: 0;
    padding-top: 0;
}

body > h1:first-child {
    margin-top: 0;
    padding-top: 0;
}

body > h1:first-child + h2 {
    margin-top: 0;
    padding-top: 0;
}

body > h3:first-child,
body > h4:first-child,
body > h5:first-child,
body > h6:first-child {
    margin-top: 0;
    padding-top: 0;
}

a:first-child h1,
a:first-child h2,
a:first-child h3,
a:first-child h4,
a:first-child h5,
a:first-child h6 {
    margin-top: 0;
    padding-top: 0;
}

h1 p,
h2 p,
h3 p,
h4 p,
h5 p,
h6 p {
    margin-top: 0;
}

li p.first {
    display: inline-block;
}

ul,
ol {
    padding-left: 30px;
}

ul:first-child,
ol:first-child {
    margin-top: 0;
}

ul:last-child,
ol:last-child {
    margin-bottom: 0;
}

blockquote {
    border-left: 4px solid #42b983;
    padding: 10px 15px;
    color: #777;
    background-color: rgba(66, 185, 131, .1);
}

table {
    padding: 0;
    word-break: initial;
}

table tr {
    border-top: 1px solid #dfe2e5;
    margin: 0;
    padding: 0;
}

table tr:nth-child(2n),
thead {
    background-color: #fafafa;
}

table tr th {
    font-weight: bold;
    border: 1px solid #dfe2e5;
    border-bottom: 0;
    text-align: left;
    margin: 0;
    padding: 6px 13px;
}

table tr td {
    border: 1px solid #dfe2e5;
    text-align: left;
    margin: 0;
    padding: 6px 13px;
}

table tr th:first-child,
table tr td:first-child {
    margin-top: 0;
}

table tr th:last-child,
table tr td:last-child {
    margin-bottom: 0;
}

#write strong {
    padding: 0 1px;
}

#write em {
    padding: 0 5px 0 2px;
}

#write table thead th {
    background-color: #f2f2f2;
}

#write .CodeMirror-gutters {
    border-right: none;
}

#write .md-fences {
    border: 1px solid #F4F4F4;
    -webkit-font-smoothing: initial;
    margin: 0.8rem 0 !important;
    padding: 0.3rem 0 !important;
    line-height: 1.43rem;
    background-color: #F8F8F8 !important;
    border-radius: 2px;
    font-family: Roboto Mono, Source Sans Pro, Monaco, courier, monospace !important;
    font-size: 0.85rem;
    word-wrap: normal;
}

#write .CodeMirror-wrap .CodeMirror-code pre {
    padding-left: 12px;
}

#write code, tt {
    margin: 0 2px;
    padding: 2px 4px;
    border-radius: 2px;
    font-family: Roboto Mono, Source Sans Pro, Monaco, courier, monospace !important;
    font-size: 0.92rem;
    color: #e96900;
    background-color: #f8f8f8;
}

#write .md-footnote {
    background-color: #f8f8f8;
    color: #e96900;
}

/* heighlight. */
#write mark {
    background-color: #EBFFEB;
    border-radius: 2px;
    padding: 2px 4px;
    margin: 0 2px;
    color: #222;
    font-weight: 500;
}

#write del {
    padding: 1px 2px;
}

.cm-s-inner .cm-link,
.cm-s-inner.cm-link {
    color: #22a2c9;
}

.cm-s-inner .cm-string {
    color: #22a2c9;
}

.md-task-list-item > input {
    margin-left: -1.3em;
}

@media print {
    html {
        font-size: 13px;
    }

    table,
    pre {
        page-break-inside: avoid;
    }

    pre {
        word-wrap: break-word;
    }
}

.md-fences {
    background-color: #f8f8f8;
}

#write pre.md-meta-block {
    padding: 1rem;
    font-size: 85%;
    line-height: 1.45;
    background-color: #f7f7f7;
    border: 0;
    border-radius: 3px;
    color: #777777;
    margin-top: 0 !important;
}

.mathjax-block > .code-tooltip {
    bottom: .375rem;
}

#write > h3.md-focus:before {
    left: -1.5625rem;
    top: .375rem;
}

#write > h4.md-focus:before {
    left: -1.5625rem;
    top: .285714286rem;
}

#write > h5.md-focus:before {
    left: -1.5625rem;
    top: .285714286rem;
}

#write > h6.md-focus:before {
    left: -1.5625rem;
    top: .285714286rem;
}

.md-image > .md-meta {
    border-radius: 3px;
    font-family: Consolas, "Liberation Mono", Courier, monospace;
    padding: 2px 0 0 4px;
    font-size: 0.9em;
    color: inherit;
}

.md-tag {
    color: inherit;
}

.md-toc {
    margin-top: 20px;
    padding-bottom: 20px;
}

.sidebar-tabs {
    border-bottom: none;
}

#typora-quick-open {
    border: 1px solid #ddd;
    background-color: #f8f8f8;
}

#typora-quick-open-item {
    background-color: #FAFAFA;
    border-color: #FEFEFE #e5e5e5 #e5e5e5 #eee;
    border-style: solid;
    border-width: 1px;
}

#md-notification:before {
    top: 10px;
}

/** focus mode */

.on-focus-mode blockquote {
    border-left-color: rgba(85, 85, 85, 0.12);
}

header,
.context-menu,
.megamenu-content,
footer {
    font-family: "Segoe UI", "Arial", sans-serif;
}

.file-node-content:hover .file-node-icon,
.file-node-content:hover .file-node-open-state {
    visibility: visible;
}

.mac-seamless-mode #typora-sidebar {
    background-color: var(--side-bar-bg-color);
}

.md-lang {
    color: #b4654d;
}

.html-for-mac .context-menu {
    --item-hover-bg-color: #E6F0FE;
}




    </style>
</head>
<body class='typora-export os-windows'>
<div id='write' class='is-node first-line-indent'><h4><a name="simple-rpc-简述" class="md-header-anchor"></a><code>simple-rpc</code><span> 简述</span>
</h4>
    <p><span>这里主要描述</span><code>simple-rpc</code><span>的设计思路。</span></p>
    <p>&nbsp;</p><h5><a name="-rpc一般流程" class="md-header-anchor"></a><code>rpc</code><span>一般流程</span></h5>
    <p>&nbsp;</p>
    <div class="md-diagram-panel">
        <svg id="mermaidChart35" width="100%" xmlns="http://www.w3.org/2000/svg" style="max-width: 710.96875px;"
             viewBox="0 0 710.96875 57.25">
            <style>
:root { --mermaid-font-family: sans-serif}
:root { --mermaid-alt-font-family: sans-serif}
            </style>
            <style></style>
            <g transform="translate(-12, -12)">
                <g class="output">
                    <g class="clusters"></g>
                    <g class="edgePaths">
                        <g class="edgePath" style="opacity: 1;">
                            <path class="path" d="M103,40.625L128,40.625L153,40.625" marker-end="url(#arrowhead315)"
                                  style="fill:none"></path>
                            <defs>
                                <marker id="arrowhead315" viewBox="0 0 10 10" refX="9" refY="5"
                                        markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto">
                                    <path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath"
                                          style="stroke-width: 1; stroke-dasharray: 1, 0;"></path>
                                </marker>
                            </defs>
                        </g>
                        <g class="edgePath" style="opacity: 1;">
                            <path class="path" d="M283.25,40.625L308.25,40.625L333.25,40.625"
                                  marker-end="url(#arrowhead316)" style="fill:none"></path>
                            <defs>
                                <marker id="arrowhead316" viewBox="0 0 10 10" refX="9" refY="5"
                                        markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto">
                                    <path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath"
                                          style="stroke-width: 1; stroke-dasharray: 1, 0;"></path>
                                </marker>
                            </defs>
                        </g>
                        <g class="edgePath" style="opacity: 1;">
                            <path class="path" d="M503.21875,40.625L528.21875,40.625L553.21875,40.625"
                                  marker-end="url(#arrowhead317)" style="fill:none"></path>
                            <defs>
                                <marker id="arrowhead317" viewBox="0 0 10 10" refX="9" refY="5"
                                        markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto">
                                    <path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath"
                                          style="stroke-width: 1; stroke-dasharray: 1, 0;"></path>
                                </marker>
                            </defs>
                        </g>
                    </g>
                    <g class="edgeLabels">
                        <g class="edgeLabel" transform="" style="opacity: 1;">
                            <g transform="translate(0,0)" class="label">
                                <foreignObject width="0" height="0">
                                    <div xmlns="http://www.w3.org/1999/xhtml"
                                         style="display: inline-block; white-space: nowrap;"><span></span></div>
                                </foreignObject>
                            </g>
                        </g>
                        <g class="edgeLabel" transform="" style="opacity: 1;">
                            <g transform="translate(0,0)" class="label">
                                <foreignObject width="0" height="0">
                                    <div xmlns="http://www.w3.org/1999/xhtml"
                                         style="display: inline-block; white-space: nowrap;"><span></span></div>
                                </foreignObject>
                            </g>
                        </g>
                        <g class="edgeLabel" transform="" style="opacity: 1;">
                            <g transform="translate(0,0)" class="label">
                                <foreignObject width="0" height="0">
                                    <div xmlns="http://www.w3.org/1999/xhtml"
                                         style="display: inline-block; white-space: nowrap;"><span></span></div>
                                </foreignObject>
                            </g>
                        </g>
                    </g>
                    <g class="nodes">
                        <g class="node" id="本地调用" transform="translate(61.5,40.625)" style="opacity: 1;">
                            <rect rx="0" ry="0" x="-41.5" y="-20.625" width="83" height="41.25"></rect>
                            <g class="label" transform="translate(0,0)">
                                <g transform="translate(-31.5,-10.625)">
                                    <foreignObject width="63.0078125" height="21.25">
                                        <div xmlns="http://www.w3.org/1999/xhtml"
                                             style="display: inline-block; font-size: 0.9rem; line-height: 21.25px; white-space: nowrap;">
                                            本地调用
                                        </div>
                                    </foreignObject>
                                </g>
                            </g>
                        </g>
                        <g class="node" id="代理类发起请求" transform="translate(218.125,40.625)" style="opacity: 1;">
                            <rect rx="0" ry="0" x="-65.125" y="-20.625" width="130.25" height="41.25"></rect>
                            <g class="label" transform="translate(0,0)">
                                <g transform="translate(-55.125,-10.625)">
                                    <foreignObject width="110.25390625" height="21.25">
                                        <div xmlns="http://www.w3.org/1999/xhtml"
                                             style="display: inline-block; font-size: 0.9rem; line-height: 21.25px; white-space: nowrap;">
                                            代理类发起请求
                                        </div>
                                    </foreignObject>
                                </g>
                            </g>
                        </g>
                        <g class="node" id="rpc服务调用相关方法" transform="translate(418.234375,40.625)" style="opacity: 1;">
                            <rect rx="0" ry="0" x="-84.984375" y="-20.625" width="169.96875" height="41.25"></rect>
                            <g class="label" transform="translate(0,0)">
                                <g transform="translate(-74.984375,-10.625)">
                                    <foreignObject width="149.98046875" height="21.25">
                                        <div xmlns="http://www.w3.org/1999/xhtml"
                                             style="display: inline-block; font-size: 0.9rem; line-height: 21.25px; white-space: nowrap;">
                                            rpc服务调用相关方法
                                        </div>
                                    </foreignObject>
                                </g>
                            </g>
                        </g>
                        <g class="node" id="服务调用并返回结果" transform="translate(634.09375,40.625)" style="opacity: 1;">
                            <rect rx="0" ry="0" x="-80.875" y="-20.625" width="161.75" height="41.25"></rect>
                            <g class="label" transform="translate(0,0)">
                                <g transform="translate(-70.875,-10.625)">
                                    <foreignObject width="141.7578125" height="21.25">
                                        <div xmlns="http://www.w3.org/1999/xhtml"
                                             style="display: inline-block; font-size: 0.9rem; line-height: 21.25px; white-space: nowrap;">
                                            服务调用并返回结果
                                        </div>
                                    </foreignObject>
                                </g>
                            </g>
                        </g>
                    </g>
                </g>
            </g>
        </svg>
    </div>
    <p>&nbsp;</p><h6><a name="客户端" class="md-header-anchor"></a><span>客户端</span></h6>
    <ol start=''>
        <li><p><span>根据接口生成代理类</span></p>
            <p><span>使用</span><code>jdk</code><span>动态代理，生成代理对象。通过</span><code>BeanContext</code><span>获取对象，当调用方法或服务时，获取相关方法信息,发起请求。等待结果返回。</span>
            </p></li>
        <li><p><span>发起对服务端的请求，返回结果等</span></p>
            <p><span>因为Netty使用事件循环，不能直接发起请求，容易阻塞，所以使用了非阻塞队列。启动一个线程监听请求队列。当调用服务时，代理类直接向队列发送请求。线程从队列获取请求后，触发实际的请求，由Netty处理，这时会将请求信息序列化，发送到服务端。</span>
                <span>同时Netty线程缓存了请求id，以对应返回结果。</span></p></li>
    </ol>
    <div class="md-diagram-panel">
        <svg height="444.140625" version="1.1" width="1169.2265625" xmlns="http://www.w3.org/2000/svg"
             xmlns:xlink="http://www.w3.org/1999/xlink"
             style="overflow: hidden; position: relative; top: -0.8375px; zoom: 0.680792; max-width: 100%; height: auto;"
             class="" viewBox="0 0 1169.2265625 444.134">
            <desc style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">Created with Raphaël 2.2.0</desc>
            <defs style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">
                <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block"
                      style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
                <marker id="raphael-marker-endblock55-obj6x34e" markerHeight="5" markerWidth="5" orient="auto"
                        refX="2.5" refY="2.5" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">
                    <use xlink:href="#raphael-marker-block" transform="rotate(180 2.5 2.5) scale(1,1)"
                         stroke-width="1.0000" fill="currentColor" stroke="none"
                         style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></use>
                </marker>
                <marker id="raphael-marker-endblock55-objc0pwq" markerHeight="5" markerWidth="5" orient="auto"
                        refX="2.5" refY="2.5" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">
                    <use xlink:href="#raphael-marker-block" transform="rotate(180 2.5 2.5) scale(1,1)"
                         stroke-width="1.0000" fill="currentColor" stroke="none"
                         style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></use>
                </marker>
                <marker id="raphael-marker-endblock55-objnzwqe" markerHeight="5" markerWidth="5" orient="auto"
                        refX="2.5" refY="2.5" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">
                    <use xlink:href="#raphael-marker-block" transform="rotate(180 2.5 2.5) scale(1,1)"
                         stroke-width="1.0000" fill="currentColor" stroke="none"
                         style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></use>
                </marker>
                <marker id="raphael-marker-endblock55-obj3s43e" markerHeight="5" markerWidth="5" orient="auto"
                        refX="2.5" refY="2.5" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">
                    <use xlink:href="#raphael-marker-block" transform="rotate(180 2.5 2.5) scale(1,1)"
                         stroke-width="1.0000" fill="currentColor" stroke="none"
                         style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></use>
                </marker>
                <marker id="raphael-marker-endblock55-obj2uyh6" markerHeight="5" markerWidth="5" orient="auto"
                        refX="2.5" refY="2.5" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">
                    <use xlink:href="#raphael-marker-block" transform="rotate(180 2.5 2.5) scale(1,1)"
                         stroke-width="1.0000" fill="currentColor" stroke="none"
                         style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></use>
                </marker>
                <marker id="raphael-marker-endblock55-obj53igy" markerHeight="5" markerWidth="5" orient="auto"
                        refX="2.5" refY="2.5" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">
                    <use xlink:href="#raphael-marker-block" transform="rotate(180 2.5 2.5) scale(1,1)"
                         stroke-width="1.0000" fill="currentColor" stroke="none"
                         style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></use>
                </marker>
                <marker id="raphael-marker-endblock55-objl8tyj" markerHeight="5" markerWidth="5" orient="auto"
                        refX="2.5" refY="2.5" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">
                    <use xlink:href="#raphael-marker-block" transform="rotate(180 2.5 2.5) scale(1,1)"
                         stroke-width="1.0000" fill="currentColor" stroke="none"
                         style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></use>
                </marker>
            </defs>
            <rect x="10" y="20" width="108" height="36.015625" rx="0" ry="0" fill="var(--bg-color)"
                  stroke="currentColor" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <rect x="20" y="30" width="88" height="16.015625" rx="0" ry="0" fill="none" stroke="none"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <text x="64" y="38.0078125" text-anchor="middle" font-family="Andale Mono, monospace" font-size="16px"
                  stroke="none" fill="currentColor"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font-family: &quot;Andale Mono&quot;, monospace; font-size: 16px;">
                <tspan dy="5.59375" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">SomeService</tspan>
            </text>
            <rect x="10" y="388.125" width="108" height="36.015625" rx="0" ry="0" fill="var(--bg-color)"
                  stroke="currentColor" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <rect x="20" y="398.125" width="88" height="16.015625" rx="0" ry="0" fill="none" stroke="none"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <text x="64" y="406.1328125" text-anchor="middle" font-family="Andale Mono, monospace" font-size="16px"
                  stroke="none" fill="currentColor"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font-family: &quot;Andale Mono&quot;, monospace; font-size: 16px;">
                <tspan dy="5.59375" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">SomeService</tspan>
            </text>
            <path fill="var(--bg-color)" stroke="currentColor" d="M64,56.015625L64,388.125" stroke-width="2"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
            <rect x="336" y="20" width="180" height="36.015625" rx="0" ry="0" fill="var(--bg-color)"
                  stroke="currentColor" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <rect x="346" y="30" width="160" height="16.015625" rx="0" ry="0" fill="none" stroke="none"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <text x="426" y="38.0078125" text-anchor="middle" font-family="Andale Mono, monospace" font-size="16px"
                  stroke="none" fill="currentColor"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font-family: &quot;Andale Mono&quot;, monospace; font-size: 16px;">
                <tspan dy="5.59375" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">RpcInvocationHandler</tspan>
            </text>
            <rect x="336" y="388.125" width="180" height="36.015625" rx="0" ry="0" fill="var(--bg-color)"
                  stroke="currentColor" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <rect x="346" y="398.125" width="160" height="16.015625" rx="0" ry="0" fill="none" stroke="none"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <text x="426" y="406.1328125" text-anchor="middle" font-family="Andale Mono, monospace" font-size="16px"
                  stroke="none" fill="currentColor"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font-family: &quot;Andale Mono&quot;, monospace; font-size: 16px;">
                <tspan dy="5.59375" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">RpcInvocationHandler</tspan>
            </text>
            <path fill="var(--bg-color)" stroke="currentColor" d="M426,56.015625L426,388.125" stroke-width="2"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
            <rect x="536" y="20" width="92" height="36.015625" rx="0" ry="0" fill="var(--bg-color)"
                  stroke="currentColor" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <rect x="546" y="30" width="72" height="16.015625" rx="0" ry="0" fill="none" stroke="none"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <text x="582" y="38.0078125" text-anchor="middle" font-family="Andale Mono, monospace" font-size="16px"
                  stroke="none" fill="currentColor"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font-family: &quot;Andale Mono&quot;, monospace; font-size: 16px;">
                <tspan dy="5.59375" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">RpcClient</tspan>
            </text>
            <rect x="536" y="388.125" width="92" height="36.015625" rx="0" ry="0" fill="var(--bg-color)"
                  stroke="currentColor" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <rect x="546" y="398.125" width="72" height="16.015625" rx="0" ry="0" fill="none" stroke="none"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <text x="582" y="406.1328125" text-anchor="middle" font-family="Andale Mono, monospace" font-size="16px"
                  stroke="none" fill="currentColor"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font-family: &quot;Andale Mono&quot;, monospace; font-size: 16px;">
                <tspan dy="5.59375" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">RpcClient</tspan>
            </text>
            <path fill="var(--bg-color)" stroke="currentColor" d="M582,56.015625L582,388.125" stroke-width="2"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
            <rect x="820" y="20" width="60" height="36.015625" rx="0" ry="0" fill="var(--bg-color)"
                  stroke="currentColor" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <rect x="830" y="30" width="40" height="16.015625" rx="0" ry="0" fill="none" stroke="none"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <text x="850" y="38.0078125" text-anchor="middle" font-family="Andale Mono, monospace" font-size="16px"
                  stroke="none" fill="currentColor"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font-family: &quot;Andale Mono&quot;, monospace; font-size: 16px;">
                <tspan dy="5.59375" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">Queue</tspan>
            </text>
            <rect x="820" y="388.125" width="60" height="36.015625" rx="0" ry="0" fill="var(--bg-color)"
                  stroke="currentColor" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <rect x="830" y="398.125" width="40" height="16.015625" rx="0" ry="0" fill="none" stroke="none"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <text x="850" y="406.1328125" text-anchor="middle" font-family="Andale Mono, monospace" font-size="16px"
                  stroke="none" fill="currentColor"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font-family: &quot;Andale Mono&quot;, monospace; font-size: 16px;">
                <tspan dy="5.59375" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">Queue</tspan>
            </text>
            <path fill="var(--bg-color)" stroke="currentColor" d="M850,56.015625L850,388.125" stroke-width="2"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
            <rect x="933.5859375" y="20" width="108.828125" height="36.015625" rx="0" ry="0" fill="var(--bg-color)"
                  stroke="currentColor" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <rect x="943.1875" y="30" width="88.8125" height="16.015625" rx="0" ry="0" fill="none" stroke="none"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <text x="988" y="38.0078125" text-anchor="middle" font-family="Andale Mono, monospace" font-size="16px"
                  stroke="none" fill="currentColor"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font-family: &quot;Andale Mono&quot;, monospace; font-size: 16px;">
                <tspan dy="5.59375" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">NettyClient</tspan>
            </text>
            <rect x="933.5859375" y="388.125" width="108.828125" height="36.015625" rx="0" ry="0" fill="var(--bg-color)"
                  stroke="currentColor" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <rect x="943.1875" y="398.125" width="88.8125" height="16.015625" rx="0" ry="0" fill="none" stroke="none"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <text x="988" y="406.1328125" text-anchor="middle" font-family="Andale Mono, monospace" font-size="16px"
                  stroke="none" fill="currentColor"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font-family: &quot;Andale Mono&quot;, monospace; font-size: 16px;">
                <tspan dy="5.59375" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">NettyClient</tspan>
            </text>
            <path fill="var(--bg-color)" stroke="currentColor" d="M988,56.015625L988,388.125" stroke-width="2"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
            <rect x="1062.4140625" y="20" width="76.8125" height="36.015625" rx="0" ry="0" fill="var(--bg-color)"
                  stroke="currentColor" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <rect x="1072.015625" y="30" width="56.8125" height="16.015625" rx="0" ry="0" fill="none" stroke="none"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <text x="1100.8203125" y="38.0078125" text-anchor="middle" font-family="Andale Mono, monospace"
                  font-size="16px" stroke="none" fill="currentColor"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font-family: &quot;Andale Mono&quot;, monospace; font-size: 16px;">
                <tspan dy="5.59375" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">Network</tspan>
            </text>
            <rect x="1062.4140625" y="388.125" width="76.8125" height="36.015625" rx="0" ry="0" fill="var(--bg-color)"
                  stroke="currentColor" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <rect x="1072.015625" y="398.125" width="56.8125" height="16.015625" rx="0" ry="0" fill="none" stroke="none"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <text x="1100.8203125" y="406.1328125" text-anchor="middle" font-family="Andale Mono, monospace"
                  font-size="16px" stroke="none" fill="currentColor"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font-family: &quot;Andale Mono&quot;, monospace; font-size: 16px;">
                <tspan dy="5.59375" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">Network</tspan>
            </text>
            <path fill="var(--bg-color)" stroke="currentColor" d="M1100.8203125,56.015625L1100.8203125,388.125"
                  stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
            <rect x="205" y="73.015625" width="80" height="16.015625" rx="0" ry="0" fill="none" stroke="none"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <text x="245" y="81.015625" text-anchor="middle" font-family="Andale Mono, monospace" font-size="16px"
                  stroke="none" fill="currentColor"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font-family: &quot;Andale Mono&quot;, monospace; font-size: 16px;">
                <tspan dy="5.6015625" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">调用某方法</tspan>
            </text>
            <path fill="var(--bg-color)" stroke="currentColor"
                  d="M64,92.03125C64,92.03125,377.45884051918983,92.03125,421.003293706548,92.03125" stroke-width="2"
                  marker-end="url(#raphael-marker-endblock55-obj6x34e)" stroke-dasharray="none"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
            <rect x="448" y="109.03125" width="112" height="16.015625" rx="0" ry="0" fill="none" stroke="none"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <text x="504" y="117.03125" text-anchor="middle" font-family="Andale Mono, monospace" font-size="16px"
                  stroke="none" fill="currentColor"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font-family: &quot;Andale Mono&quot;, monospace; font-size: 16px;">
                <tspan dy="5.6015625" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">发送请求和回调</tspan>
            </text>
            <path fill="var(--bg-color)" stroke="currentColor"
                  d="M426,128.046875C426,128.046875,550.3525292873383,128.046875,577.0081739929738,128.046875"
                  stroke-width="2" marker-end="url(#raphael-marker-endblock55-objc0pwq)" stroke-dasharray="none"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
            <rect x="592" y="145.046875" width="248" height="16.015625" rx="0" ry="0" fill="none" stroke="none"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <text x="716" y="153.046875" text-anchor="middle" font-family="Andale Mono, monospace" font-size="16px"
                  stroke="none" fill="currentColor"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font-family: &quot;Andale Mono&quot;, monospace; font-size: 16px;">
                <tspan dy="5.6015625" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">发送RpcRequestEvent(请求和回调)
                </tspan>
            </text>
            <path fill="var(--bg-color)" stroke="currentColor"
                  d="M582,164.0625C582,164.0625,808.3154106140137,164.0625,845.0032603815198,164.0625" stroke-width="2"
                  marker-end="url(#raphael-marker-endblock55-objnzwqe)" stroke-dasharray="none"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
            <rect x="903" y="181.0625" width="32" height="16.015625" rx="0" ry="0" fill="none" stroke="none"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <text x="919" y="189.0625" text-anchor="middle" font-family="Andale Mono, monospace" font-size="16px"
                  stroke="none" fill="currentColor"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font-family: &quot;Andale Mono&quot;, monospace; font-size: 16px;">
                <tspan dy="5.6015625" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">监听</tspan>
            </text>
            <path fill="var(--bg-color)" stroke="currentColor"
                  d="M988,200.078125C988,200.078125,879.7335872650146,200.078125,854.9930202923715,200.078125"
                  stroke-width="2" marker-end="url(#raphael-marker-endblock55-obj3s43e)" stroke-dasharray="none"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
            <rect x="0" y="0" width="0" height="0" rx="0" ry="0" fill="none" stroke="none"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <text x="919" y="225.078125" text-anchor="middle" font-family="Andale Mono, monospace" font-size="16px"
                  stroke="none" fill="currentColor"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font-family: &quot;Andale Mono&quot;, monospace; font-size: 16px;">
                <tspan dy="225.078125" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></tspan>
            </text>
            <path fill="var(--bg-color)" stroke="currentColor"
                  d="M850,220.078125C850,220.078125,958.2664127349854,220.078125,983.0069797076285,220.078125"
                  stroke-width="2" marker-end="url(#raphael-marker-endblock55-obj2uyh6)" stroke-dasharray="6,2"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
            <rect x="0" y="0" width="0" height="0" rx="0" ry="0" fill="none" stroke="none"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <text x="1044.41015625" y="245.078125" text-anchor="middle" font-family="Andale Mono, monospace"
                  font-size="16px" stroke="none" fill="currentColor"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font-family: &quot;Andale Mono&quot;, monospace; font-size: 16px;">
                <tspan dy="245.078125" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></tspan>
            </text>
            <path fill="var(--bg-color)" stroke="currentColor"
                  d="M988,240.078125C988,240.078125,1073.9928658306599,240.078125,1095.8269919204758,240.078125"
                  stroke-width="2" marker-end="url(#raphael-marker-endblock55-obj53igy)" stroke-dasharray="6,2"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
            <rect x="1000.40625" y="257.078125" width="88.015625" height="16.015625" rx="0" ry="0" fill="none"
                  stroke="none" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <text x="1044.41015625" y="265.078125" text-anchor="middle" font-family="Andale Mono, monospace"
                  font-size="16px" stroke="none" fill="currentColor"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font-family: &quot;Andale Mono&quot;, monospace; font-size: 16px;">
                <tspan dy="5.6015625" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">RpcResponse</tspan>
            </text>
            <path fill="var(--bg-color)" stroke="currentColor"
                  d="M1100.8203125,276.09375C1100.8203125,276.09375,1014.8274466693401,276.09375,992.9933205795242,276.09375"
                  stroke-width="2" marker-end="url(#raphael-marker-endblock55-objl8tyj)" stroke-dasharray="6,2"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
            <rect x="870" y="296.09375" width="98" height="26.015625" rx="0" ry="0" fill="var(--bg-color)"
                  stroke="currentColor" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <rect x="875" y="301.09375" width="88" height="16.015625" rx="0" ry="0" fill="none" stroke="none"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <text x="919" y="309.1015625" text-anchor="middle" font-family="Andale Mono, monospace" font-size="16px"
                  stroke="none" fill="currentColor"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font-family: &quot;Andale Mono&quot;, monospace; font-size: 16px;">
                <tspan dy="5.59375" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">执行回调--&gt;</tspan>
            </text>
            <rect x="84" y="342.109375" width="322" height="26.015625" rx="0" ry="0" fill="var(--bg-color)"
                  stroke="currentColor" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <rect x="89" y="347.109375" width="312" height="16.015625" rx="0" ry="0" fill="none" stroke="none"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <text x="245" y="355.1171875" text-anchor="middle" font-family="Andale Mono, monospace" font-size="16px"
                  stroke="none" fill="currentColor"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font-family: &quot;Andale Mono&quot;, monospace; font-size: 16px;">
                <tspan dy="5.59375" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">代理自旋，等待回调执行结束，获取结果--&gt;
                </tspan>
            </text>
        </svg>
    </div>
    <p>&nbsp;</p><h6><a name="服务端" class="md-header-anchor"></a><span>服务端</span></h6>
    <ol start=''>
        <li><p><span>初始化相关服务</span></p>
            <p><span>实例化相关服务实现。这里作了简化，要求服务不相互依赖等，只是一个简单的实例化功能，并不是完整的bean容器。</span></p></li>
        <li><p><span>响应请求，调用相关服务</span></p>
            <p><span>Netty线程监听到请求后，解析数据，找到相关服务实现，通过反射调用方法,并处理异常处理等并返回结果。</span></p></li>
    </ol>
    <div class="md-diagram-panel">
        <svg height="306.09375" version="1.1" width="494.8203125" xmlns="http://www.w3.org/2000/svg"
             xmlns:xlink="http://www.w3.org/1999/xlink"
             style="overflow: hidden; position: relative; top: -0.025px; max-width: 100%; height: auto;"
             viewBox="0 0 494.8203125 306.087">
            <desc style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">Created with Raphaël 2.2.0</desc>
            <defs style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">
                <marker id="raphael-marker-endblock55-objwa98i" markerHeight="5" markerWidth="5" orient="auto"
                        refX="2.5" refY="2.5" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">
                    <use xlink:href="#raphael-marker-block" transform="rotate(180 2.5 2.5) scale(1,1)"
                         stroke-width="1.0000" fill="currentColor" stroke="none"
                         style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></use>
                </marker>
                <marker id="raphael-marker-endblock55-obj19kmn" markerHeight="5" markerWidth="5" orient="auto"
                        refX="2.5" refY="2.5" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">
                    <use xlink:href="#raphael-marker-block" transform="rotate(180 2.5 2.5) scale(1,1)"
                         stroke-width="1.0000" fill="currentColor" stroke="none"
                         style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></use>
                </marker>
                <marker id="raphael-marker-endblock55-obja1v5l" markerHeight="5" markerWidth="5" orient="auto"
                        refX="2.5" refY="2.5" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">
                    <use xlink:href="#raphael-marker-block" transform="rotate(180 2.5 2.5) scale(1,1)"
                         stroke-width="1.0000" fill="currentColor" stroke="none"
                         style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></use>
                </marker>
                <marker id="raphael-marker-endblock55-objz2hgo" markerHeight="5" markerWidth="5" orient="auto"
                        refX="2.5" refY="2.5" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">
                    <use xlink:href="#raphael-marker-block" transform="rotate(180 2.5 2.5) scale(1,1)"
                         stroke-width="1.0000" fill="currentColor" stroke="none"
                         style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></use>
                </marker>
            </defs>
            <rect x="10" y="20" width="76.8125" height="36.015625" rx="0" ry="0" fill="var(--bg-color)"
                  stroke="currentColor" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <rect x="19.59375" y="30" width="56.8125" height="16.015625" rx="0" ry="0" fill="none" stroke="none"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <text x="48.40625" y="38.0078125" text-anchor="middle" font-family="Andale Mono, monospace" font-size="16px"
                  stroke="none" fill="currentColor"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font-family: &quot;Andale Mono&quot;, monospace; font-size: 16px;">
                <tspan dy="5.59375" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">Network</tspan>
            </text>
            <rect x="10" y="250.078125" width="76.8125" height="36.015625" rx="0" ry="0" fill="var(--bg-color)"
                  stroke="currentColor" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <rect x="19.59375" y="260.078125" width="56.8125" height="16.015625" rx="0" ry="0" fill="none" stroke="none"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <text x="48.40625" y="268.0859375" text-anchor="middle" font-family="Andale Mono, monospace"
                  font-size="16px" stroke="none" fill="currentColor"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font-family: &quot;Andale Mono&quot;, monospace; font-size: 16px;">
                <tspan dy="5.59375" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">Network</tspan>
            </text>
            <path fill="var(--bg-color)" stroke="currentColor" d="M48.40625,56.015625L48.40625,250.078125"
                  stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
            <rect x="227.9921875" y="20" width="108.828125" height="36.015625" rx="0" ry="0" fill="var(--bg-color)"
                  stroke="currentColor" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <rect x="237.59375" y="30" width="88.8125" height="16.015625" rx="0" ry="0" fill="none" stroke="none"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <text x="282.40625" y="38.0078125" text-anchor="middle" font-family="Andale Mono, monospace"
                  font-size="16px" stroke="none" fill="currentColor"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font-family: &quot;Andale Mono&quot;, monospace; font-size: 16px;">
                <tspan dy="5.59375" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">NettyServer</tspan>
            </text>
            <rect x="227.9921875" y="250.078125" width="108.828125" height="36.015625" rx="0" ry="0"
                  fill="var(--bg-color)" stroke="currentColor" stroke-width="2"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <rect x="237.59375" y="260.078125" width="88.8125" height="16.015625" rx="0" ry="0" fill="none"
                  stroke="none" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <text x="282.40625" y="268.0859375" text-anchor="middle" font-family="Andale Mono, monospace"
                  font-size="16px" stroke="none" fill="currentColor"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font-family: &quot;Andale Mono&quot;, monospace; font-size: 16px;">
                <tspan dy="5.59375" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">NettyServer</tspan>
            </text>
            <path fill="var(--bg-color)" stroke="currentColor" d="M282.40625,56.015625L282.40625,250.078125"
                  stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
            <rect x="356.8203125" y="20" width="108" height="36.015625" rx="0" ry="0" fill="var(--bg-color)"
                  stroke="currentColor" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <rect x="366.8125" y="30" width="88.015625" height="16.015625" rx="0" ry="0" fill="none" stroke="none"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <text x="410.8203125" y="38.0078125" text-anchor="middle" font-family="Andale Mono, monospace"
                  font-size="16px" stroke="none" fill="currentColor"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font-family: &quot;Andale Mono&quot;, monospace; font-size: 16px;">
                <tspan dy="5.59375" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">BeanContext</tspan>
            </text>
            <rect x="356.8203125" y="250.078125" width="108" height="36.015625" rx="0" ry="0" fill="var(--bg-color)"
                  stroke="currentColor" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <rect x="366.8125" y="260.078125" width="88.015625" height="16.015625" rx="0" ry="0" fill="none"
                  stroke="none" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <text x="410.8203125" y="268.0859375" text-anchor="middle" font-family="Andale Mono, monospace"
                  font-size="16px" stroke="none" fill="currentColor"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font-family: &quot;Andale Mono&quot;, monospace; font-size: 16px;">
                <tspan dy="5.59375" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">BeanContext</tspan>
            </text>
            <path fill="var(--bg-color)" stroke="currentColor" d="M410.8203125,56.015625L410.8203125,250.078125"
                  stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
            <rect x="149.40625" y="73.015625" width="32" height="16.015625" rx="0" ry="0" fill="none" stroke="none"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <text x="165.40625" y="81.015625" text-anchor="middle" font-family="Andale Mono, monospace" font-size="16px"
                  stroke="none" fill="currentColor"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font-family: &quot;Andale Mono&quot;, monospace; font-size: 16px;">
                <tspan dy="5.6015625" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">请求</tspan>
            </text>
            <path fill="var(--bg-color)" stroke="currentColor"
                  d="M48.40625,92.03125C48.40625,92.03125,243.4981174468994,92.03125,277.4105709679425,92.03125"
                  stroke-width="2" marker-end="url(#raphael-marker-endblock55-objwa98i)" stroke-dasharray="6,2"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
            <rect x="298.609375" y="109.03125" width="96.015625" height="16.015625" rx="0" ry="0" fill="none"
                  stroke="none" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <text x="346.61328125" y="117.03125" text-anchor="middle" font-family="Andale Mono, monospace"
                  font-size="16px" stroke="none" fill="currentColor"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font-family: &quot;Andale Mono&quot;, monospace; font-size: 16px;">
                <tspan dy="5.6015625" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">获取服务实现</tspan>
            </text>
            <path fill="var(--bg-color)" stroke="currentColor"
                  d="M282.40625,128.046875C282.40625,128.046875,382.15491532720625,128.046875,405.825741181221,128.046875"
                  stroke-width="2" marker-end="url(#raphael-marker-endblock55-obj19kmn)" stroke-dasharray="none"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
            <rect x="0" y="0" width="0" height="0" rx="0" ry="0" fill="none" stroke="none"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <text x="346.61328125" y="153.046875" text-anchor="middle" font-family="Andale Mono, monospace"
                  font-size="16px" stroke="none" fill="currentColor"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font-family: &quot;Andale Mono&quot;, monospace; font-size: 16px;">
                <tspan dy="153.046875" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></tspan>
            </text>
            <path fill="var(--bg-color)" stroke="currentColor"
                  d="M410.8203125,148.046875C410.8203125,148.046875,311.07164717279375,148.046875,287.400821318779,148.046875"
                  stroke-width="2" marker-end="url(#raphael-marker-endblock55-obja1v5l)" stroke-dasharray="6,2"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
            <rect x="68.40625" y="168.046875" width="194" height="26.015625" rx="0" ry="0" fill="var(--bg-color)"
                  stroke="currentColor" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <rect x="73.40625" y="173.046875" width="184" height="16.015625" rx="0" ry="0" fill="none" stroke="none"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <text x="165.40625" y="181.0546875" text-anchor="middle" font-family="Andale Mono, monospace"
                  font-size="16px" stroke="none" fill="currentColor"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font-family: &quot;Andale Mono&quot;, monospace; font-size: 16px;">
                <tspan dy="5.59375" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">通过反射执行对应方法--&gt;</tspan>
            </text>
            <rect x="109.40625" y="211.0625" width="112" height="16.015625" rx="0" ry="0" fill="none" stroke="none"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect>
            <text x="165.40625" y="219.0625" text-anchor="middle" font-family="Andale Mono, monospace" font-size="16px"
                  stroke="none" fill="currentColor"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font-family: &quot;Andale Mono&quot;, monospace; font-size: 16px;">
                <tspan dy="5.6015625" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">返回结果或异常</tspan>
            </text>
            <path fill="var(--bg-color)" stroke="currentColor"
                  d="M282.40625,230.078125C282.40625,230.078125,87.31438255310059,230.078125,53.401929032057524,230.078125"
                  stroke-width="2" marker-end="url(#raphael-marker-endblock55-objz2hgo)" stroke-dasharray="6,2"
                  style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
        </svg>
    </div>
    <p>&nbsp;</p></div>
</body>
</html>